package com.springboot.study.pojo;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
/**
 * UserInfo 实体类，用于 JPA 自动生成数据库表和字段映射
 */
@Data  // 自动生成常用方法（getter/setter/toString/equals/hashCode）
@NoArgsConstructor  // 生成无参构造器，JPA 需要
@AllArgsConstructor  // 生成全参构造器，方便创建对象
@Entity  // 标注这是一个 JPA 实体类，对应数据库中的一张表
@Table(name = "user_info")  // 指定数据库中表名为 user_info（默认是类名小写）
public class UserInfo {
    @Id  // 表示主键字段
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // 主键自增策略，数据库自动生成 ID
    private Long id;

    @Column(nullable = false, length = 50, unique = true)
    // 映射数据库字段，设置不允许为空，长度最多50，且唯一（不能重复）
    private String username;  // 用户名

    @Column(nullable = false, length = 100)
    // 密码字段，不允许为空，最大长度100
    private String password;  // 用户密码

    @Column(length = 100)  // 邮箱字段，最大长度100，可以为空
    private String email;

    @Column(length = 20)  // 电话字段，最大长度20，可以为空
    private String phone;

    @Column(name = "created_time", updatable = false)
    // 创建时间字段，映射数据库列名为 created_time，不允许更新（只写入一次）
    private LocalDateTime createdTime;

    @Column(name = "updated_time")
    // 更新时间字段，映射数据库列名为 updated_time，可更新
    private LocalDateTime updatedTime;

    /**
     * JPA实体生命周期回调方法
     * 在实体第一次持久化（插入数据库）之前调用
     * 设置创建时间和更新时间为当前时间
     */
    @PrePersist
    protected void onCreate() {
        this.createdTime = LocalDateTime.now();
        this.updatedTime = LocalDateTime.now();
    }

    /**
     * JPA实体生命周期回调方法
     * 在实体更新之前调用
     * 设置更新时间为当前时间
     */
    @PreUpdate
    protected void onUpdate() {
        this.updatedTime = LocalDateTime.now();
    }
}
